package com.own.component.util.database.base;

import com.alibaba.druid.sql.parser.SQLCreateTableParser;
import com.own.component.util.database.base.model.DatabaseEntryField;
import com.own.component.util.database.base.parent.BaseDatabaseTableColumnSqlProperty;
import com.own.component.util.database.base.parent.BaseDatabaseTableSqlProperty;
import lombok.Getter;
import lombok.extern.slf4j.Slf4j;

import java.util.HashMap;
import java.util.Map;

/**
 * BaseDatabaseProperty
 *
 * @author chenxueli
 * @date 2022-10-15 12:27:00
 */
@Slf4j
public abstract class BaseDatabaseProperty implements BaseDatabaseTableSqlProperty, BaseDatabaseTableColumnSqlProperty {

    private final Map<String, BaseDatabaseFieldMapping> FIELD_MAPPING = new HashMap<>();
    /**
     * 属性字段信息
     */
    @Getter
    private final DatabaseEntryField field;
    private BaseDatabaseFieldMapping DEFAULT_FIELD_TYPE;

    /**
     * 属性字段信息构造器
     *
     * @param field 属性字段信息
     */
    public BaseDatabaseProperty(DatabaseEntryField field) {
        this.field = field;
    }

    /**
     * 映射方法构造器
     *
     * @param field 属性字段信息
     * @param array 映射方法
     */
    public BaseDatabaseProperty(DatabaseEntryField field, BaseDatabaseFieldMapping[] array) {
        this.field = field;
        put(array);
    }

    /**
     * 驱动信息
     */
    public abstract String driver();

    /**
     * 地址信息
     */
    public abstract String connectionUrl();

    /**
     * 数据库名称的获取正则
     *
     * @return 数据库名称的获取正则
     */
    public abstract String databaseRegex();

    /**
     * 处理创建sql的的解析器
     *
     * @param sql sql语句
     * @return 解析器
     */
    public abstract SQLCreateTableParser createTableParser(String sql);

    /**
     * 数据库名称的字段
     *
     * @return 数据库名称的字段
     */
    @Override
    public String tableNameField() {
        return field.getTableName();
    }

    /**
     * 默认的映射类型
     *
     * @return 默认的映射类型
     */
    public abstract BaseDatabaseFieldMapping defaultFieldType();

    /**
     * 设置信息
     *
     * @param type    类型
     * @param mapping 映射
     */
    protected final void put(String type, BaseDatabaseFieldMapping mapping) {
        FIELD_MAPPING.put(type, mapping);
    }

    /**
     * 设置信息
     *
     * @param array 映射数组信息
     */
    protected final void put(BaseDatabaseFieldMapping[] array) {
        for (var item : array) {
            put(item.databaseType(), item);
        }
    }

    /**
     * 获取字段映射信息
     *
     * @param name 字段名称
     * @return 字段映射信息
     */
    public final BaseDatabaseFieldMapping getFieldMapping(String name) {
        return FIELD_MAPPING.get(name);
    }

    /**
     * 获取字段映射信息
     *
     * @param name 字段名称
     * @return 字段映射信息
     */
    public final BaseDatabaseFieldMapping getFieldMappingAndDefault(String name) {
        var mapping = getFieldMapping(name);
        if (mapping != null) {
            return mapping;
        }
        // 获取默认的信息
        if (DEFAULT_FIELD_TYPE == null) {
            DEFAULT_FIELD_TYPE = defaultFieldType();
        }
        return DEFAULT_FIELD_TYPE;
    }

}
